package dao;

import entidad.Proveedor;
import java.util.ArrayList;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

public class ProveedorDAO {
    
    private EntityManagerFactory emf = JPAUtil.getEntityManagerFactory();
    
    public void crear(Proveedor object) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        try {
            em.persist(object);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
        }
    }

    public boolean eliminar(Proveedor object) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        boolean ret = false;
        try {
            em.remove(object);
            em.getTransaction().commit();
            ret = true;
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
            return ret;
        }
    }

    public Proveedor leer(Proveedor object) {
        EntityManager em = emf.createEntityManager();
        Proveedor proveedor = null;
        Query q = em.createQuery("SELECT p FROM Proveedor p "
                + "WHERE p.nit = :nit")
                .setParameter("nit", object.getNit());
        try {
            proveedor = (Proveedor) q.getSingleResult();
        } catch (NoResultException e) {
            proveedor = null;
        } catch (NonUniqueResultException e) {
            proveedor = (Proveedor) q.getResultList().get(0);
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            em.close();
            return proveedor;
        }
    }
    
    public ArrayList<Proveedor> leerT() {
        /*
         * POR FAVOR NO ELIMINAR
         * Este metodo devuelve en una lista todas las entradas en 
         * la base de datos de los proveedores
         */
        EntityManager em = emf.createEntityManager();
        ArrayList<Proveedor> proveedores = null;
        Query q = em.createQuery("SELECT p FROM Proveedor p ");
        try {
            proveedores = (ArrayList<Proveedor>) q.getResultList();
        } catch (NoResultException e) {
            proveedores = null;
        } catch (NonUniqueResultException e) {
//            proveedores = (ArrayList<Proveedor>) q.getResultList().get(0);
            proveedores = null;
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            em.close();
            return proveedores;
        }
    }

    public boolean actualizar(Proveedor object, Proveedor nuevoObjeto) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        boolean ret = false;
        try {
            object = leer(object);
            
            object.setCedula(nuevoObjeto.getCedula());
            object.setNombre(nuevoObjeto.getNombre());
            object.setNombredeContacto(nuevoObjeto.getNombredeContacto());
            object.setTelefono(nuevoObjeto.getTelefono());
            object.setUbicacion(nuevoObjeto.getUbicacion());
            
            em.merge(object);
            em.getTransaction().commit();
            ret = true;
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
        } finally {
            em.close();
            return ret;
        }
    }

    public ArrayList<Proveedor> buscar(String string) {
        EntityManager em = emf.createEntityManager();
        Query q = em.createQuery("SELECT p FROM Proveedor p ");
                //+ "WHERE u.codigo = :codigo")
                //.setParameter("codigo", str);
        
        ArrayList<Proveedor> ret = (ArrayList<Proveedor>) q.getResultList();
        
        em.close();
        return ret;
    }
    
}
